#ifndef STX_ALGORITHM_MINMAX_HPP
#define STX_ALGORITHM_MINMAX_HPP

#include <stx/algorithm/common.hpp>

namespace stx {

template<class T, class Compare>
inline std::pair<const T&, const T&>
minmax(const T& a, const T& b, Compare comp)
{
    return comp(b, a)
        ? std::pair<const T&, const T&>(b, a)
        : std::pair<const T&, const T&>(a, b);
}

template<class T>
inline std::pair<const T&, const T&>
minmax(const T& a, const T& b)
{
    return stx::minmax(a, b, stx::less<T>());
}

#ifdef STX_CPP11

template<class T>
inline std::pair<T, T>
minmax(std::initializer_list<T> t)
{
    std::pair<const T*, const T*> p = stx::minmax_element(t.begin(), t.end());
    return std::pair<T, T>(*p.first, *p.second);
}

template<class T, class Compare>
inline std::pair<T, T>
minmax(std::initializer_list<T> t, Compare comp)
{
    std::pair<const T*, const T*> p = stx::minmax_element(t.begin(), t.end(), comp);
    return std::pair<T, T>(*p.first, *p.second);
}

#endif

} // namespace stx

#endif // STX_ALGORITHM_MINMAX_HPP
